{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to: Build a simple neural network with TensorFlow Eager\n",
    "\n",
    "Hello everyone! In this tutorial we are going to build a simple feedforward neural network\n",
    "using the imperative mode of TensorFlow. Hope you will find it useful! If you have any suggestions on how I can improve the code, please let me know. \n",
    "\n",
    "### Tutorial steps:\n",
    "----\n",
    "\n",
    "![img](tutorials_graphics/01_flowchart.png)\n",
    "\n",
    "**Version used: TensorFlow 1.7**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 1: Import useful libraries and enable eager mode\n",
    "----"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import TensorFlow and TensorFlow Eager\n",
    "import tensorflow as tf\n",
    "import tensorflow.contrib.eager as tfe\n",
    "\n",
    "# Import function to generate toy classication problem\n",
    "from sklearn.datasets import make_moons\n",
    "import numpy as np\n",
    "\n",
    "# Import library for plots\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Enable eager mode. Once activated it cannot be reversed! Run just once.\n",
    "tfe.enable_eager_execution()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 2: Generate toy dataset for binary classification\n",
    "----\n",
    "We will generate a toy dataset, to train our network. I chose the make_moons function from sklearn. I believe it is perfect for our task, as the classes are not linearly separable so a neural network will be very useful."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generate toy dataset for classification\n",
    "# X is a matrix of n_samples x n_features and represents the input features\n",
    "# y is a vector with length n_samples and represents our targets\n",
    "X, y = make_moons(n_samples=100, noise=0.1, random_state=2018)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 3: Visualize generated dataset\n",
    "----"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fc520d92f28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,0], X[:,1], c=y, cmap=plt.cm.autumn)\n",
    "plt.xlabel('First feature')\n",
    "plt.ylabel('Second feature')\n",
    "plt.title('Toy classification problem')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 4: Build a single hidden layer neural  network (Linear -> ReLU -> Linear output)\n",
    "----\n",
    "Our first trial is a simple neural network with a single hidden layer. The easiest way to build neural networks models with TensorFlow Eager is with classes. During initialization, you define the layers needed to run a forward-pass through the model.\n",
    "\n",
    "As this is a classification problem, we will be using the softmax cross-entropy loss. Normally, we would have to one-hot encode our targets. To avoid this, we will be using the sparse softmax loss, which takes as an input the raw targets. No need for further processing! HOORAY :).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "class simple_nn(tf.keras.Model):\n",
    "    def __init__(self):\n",
    "        super(simple_nn, self).__init__()\n",
    "        \"\"\" Define here the layers used during the forward-pass \n",
    "            of the neural network.\n",
    "        \"\"\"   \n",
    "        # Hidden layer.\n",
    "        self.dense_layer = tf.layers.Dense(10, activation=tf.nn.relu)\n",
    "        # Output layer. No activation.\n",
    "        self.output_layer = tf.layers.Dense(2, activation=None)\n",
    "    \n",
    "    def predict(self, input_data):\n",
    "        \"\"\" Runs a forward-pass through the network.     \n",
    "            Args:\n",
    "                input_data: 2D tensor of shape (n_samples, n_features).   \n",
    "            Returns:\n",
    "                logits: unnormalized predictions.\n",
    "        \"\"\"\n",
    "        hidden_activations = self.dense_layer(input_data)\n",
    "        logits = self.output_layer(hidden_activations)\n",
    "        return logits\n",
    "    \n",
    "    def loss_fn(self, input_data, target):\n",
    "        \"\"\" Defines the loss function used during \n",
    "            training.         \n",
    "        \"\"\"\n",
    "        logits = self.predict(input_data)\n",
    "        loss = tf.losses.sparse_softmax_cross_entropy(labels=target, logits=logits)\n",
    "        return loss\n",
    "    \n",
    "    def grads_fn(self, input_data, target):\n",
    "        \"\"\" Dynamically computes the gradients of the loss value\n",
    "            with respect to the parameters of the model, in each\n",
    "            forward pass.\n",
    "        \"\"\"\n",
    "        with tfe.GradientTape() as tape:\n",
    "            loss = self.loss_fn(input_data, target)\n",
    "        return tape.gradient(loss, self.variables)\n",
    "    \n",
    "    def fit(self, input_data, target, optimizer, num_epochs=500, verbose=50):\n",
    "        \"\"\" Function to train the model, using the selected optimizer and\n",
    "            for the desired number of epochs.\n",
    "        \"\"\"\n",
    "        for i in range(num_epochs):\n",
    "            grads = self.grads_fn(input_data, target)\n",
    "            optimizer.apply_gradients(zip(grads, self.variables))\n",
    "            if (i==0) | ((i+1)%verbose==0):\n",
    "                print('Loss at epoch %d: %f' %(i+1, self.loss_fn(input_data, target).numpy()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 5: Train the model with gradient descent\n",
    "----\n",
    "Use backpropagation to train the variables of our model. Feel free to play with the learning rate and the number of epochs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_tensor = tf.constant(X)\n",
    "y_tensor = tf.constant(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loss at epoch 1: 0.653288\n",
      "Loss at epoch 50: 0.283921\n",
      "Loss at epoch 100: 0.260529\n",
      "Loss at epoch 150: 0.244092\n",
      "Loss at epoch 200: 0.221653\n",
      "Loss at epoch 250: 0.186211\n",
      "Loss at epoch 300: 0.139418\n",
      "Loss at epoch 350: 0.103654\n",
      "Loss at epoch 400: 0.078874\n",
      "Loss at epoch 450: 0.062550\n",
      "Loss at epoch 500: 0.051096\n"
     ]
    }
   ],
   "source": [
    "optimizer = tf.train.GradientDescentOptimizer(5e-1)\n",
    "model = simple_nn()\n",
    "model.fit(X_tensor, y_tensor, optimizer, num_epochs=500, verbose=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 7: Plot decision boundary\n",
    "----\n",
    "The code for visualizing the decision boundary of our model has been inspired from [this tutorial](http://scikit-learn.org/stable/auto_examples/svm/plot_iris.html#sphx-glr-auto-examples-svm-plot-iris-py)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0e149a8b70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create a mesh to plot in\n",
    "x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
    "y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
    "xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),\n",
    "                     np.arange(y_min, y_max, 0.01))\n",
    "\n",
    "# Predict target for each sample xx, yy\n",
    "Z = np.argmax(model.predict(tf.constant(np.c_[xx.ravel(), yy.ravel()])).numpy(), axis=1)\n",
    "\n",
    "# Put the result into a color plot\n",
    "Z = Z.reshape(xx.shape)\n",
    "fig = plt.figure()\n",
    "plt.contourf(xx, yy, Z, cmap=plt.cm.autumn, alpha=0.8)\n",
    "\n",
    "# Plot our training points\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.autumn, edgecolors='k')\n",
    "plt.xlim(xx.min(), xx.max())\n",
    "plt.ylim(yy.min(), yy.max())\n",
    "plt.xlabel('First feature', fontsize=15)\n",
    "plt.ylabel('Second feature', fontsize=15)\n",
    "plt.title('Toy classification problem', fontsize=15)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
